\chapter{Системное}
\pagenumbering{arabic}

\section{Монтирование разделов в Linux}
В переводе на язык UNIX, это звучит так:
\begin{lstlisting}
# mount -t vfat /dev/hda3 /mnt/storage
\end{lstlisting}

Если нужно часто монтировать одни и те же разделы, занесите их в /etc/fstab - это общесистемный конфиг

Файл /etc/fstab состоит из колонок, разделителями между которыми являются символы табуляции (клавиша TAB). Вот пример содержимого файла /etc/fstab:
\begin{lstlisting}
# /etc/fstab: static file system information.
/dev/hda2 / reiserfs notail,noatime 0 1
/dev/hdb /mnt/cdrom iso9660 ro,user,noauto 0 0
/dev/sda1 /mnt/flash vfat iocharset=koi8-r,codepage=866,rw,user,auto 0 0
\end{lstlisting}
% % Лицензия на материалы этого текст
% 
% Материалы сайта "Записки дебианщика" написаны virens и доступны на условиях лицензии Creative Commons Attribution-Non-Commercial-Share Alike 3.0 Unported License. Вы можете копировать, распространять, показывать эту работу, и создавать производные работы в некоммерческих целях на условиях:
% 
% 1) обязательной ссылки на автора (virens, http://mydebianblog.blogspot.com/) и
% 
% 2) распространении любых производных работ на условиях этой же лицензии (ссылка на эту лицензию 
% обязательна!).
% 
% Пожалуйста соблюдайте условия лицензии.
% 
% This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License. 
Формат колонок такой:

\begin{itemize}
 \item  Монтируемое устройство (файл-устройство, он же раздел, который вы хотите примонтировать).
 \item Точка монтирования (в какую директорию в файловой системе монтировать).
 \item Тип монтируемой файловой системы.
 \item Опции монтирования (кодировка языка, необходимость монтирования при старте).
 \item Dump (обычно 0).
 \item Pass (обычно 0).
\end{itemize}
Важно, чтобы вы вставляли Тab после каждой колонки при редактировании /etc/fstab

\subsection{Кодировки кириллицы при монтировании}
Временное, однократное монтирование, например, флешки, выглядит в командной строке так:
\begin{lstlisting}
# mount -t vfat /dev/XX /mnt/YY -o iocharset=utf8,codepage=866
\end{lstlisting}

Пример: монтирование типичной флешки выглядит так

\begin{lstlisting}
# sudo mount -t vfat /dev/sda1 /mnt/flash -o iocharset=utf8,codepage=866
\end{lstlisting}

То есть монтируем раздел /dev/sda1 типа vfat в точку монтирования /mnt/flash


\subsection{Монтирование NTFS}
Временное, однократное монтирование, например, раздела с данными Windows, выглядит так:
\begin{lstlisting}
# mount -t ntfs-3g /dev/XX /mnt/YY -o umask=0,nls=utf8
\end{lstlisting}

То есть монтируем раздел /dev/sda1 типа ntfs-3g в точку монтирования /mnt/flash

\section{Файл подкачки: swap-файл и swap-раздел в Linux}
Прежде, чем что-то создавать, хорошо бы узнать, сколько swap-пространства у нас уже имеется в системе - для этого следует дать команду в консоли от рута:
\begin{lstlisting}
# swapon -s
\end{lstlisting}

Результат будет в виде:

\begin{lstlisting}
Filename Type Size Used Priority
/dev/hda1 partition 289128 0 -1
\end{lstlisting}

Итак, описание вывода команды:
\begin{itemize}
 \item  Filename описывает имеющиеся у вас своп-пространства и где они находятся.
 \item  Type указывает тип пространства: partition (раздел) или file (файл).
 \item  Size сообщает общий размер Swap-пространств.
 \item Used говорит о том, сколько сейчас свопа задействовано.
 \item  Priority указан приоритет, т.е. какие пространства системе использовать вначале. 
\end{itemize}


\subsection{Создание swap-файла в Linux}
1. Открываем консоль/терминал и получаем полномочия root или используем sudo:

\begin{lstlisting}
$ su
\end{lstlisting}

2. Даём команду:

\begin{lstlisting}
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=500
\end{lstlisting}

В команде dd для задания размеров можно использовать суффиксы K, M, G для килобайт, мегабайт и гигабайт соответственно. В данном примере это 500 Мегабайт файла подкачки.

3. Поясняем системе, что созданный пустой файл это всё-таки файл подкачки для Linux:

\begin{lstlisting}
$ sudo mkswap /swapfile
\end{lstlisting}

4. Подключаем созданный swap-файл:

\begin{lstlisting}
$ sudo swapon /swapfile
\end{lstlisting}

При этом в выводе команды top или команды free должно появиться упоминание, что свопинга в системе поприбавилось. Чтобы отключить файл подкачки, пишем

\begin{lstlisting}
$ sudo swapoff /swapfile
\end{lstlisting}

Чтобы не подключать swap-файл или swap-раздел каждый раз, полезно занести запись в /etc/fstab следующего содержания:

\begin{lstlisting}
/swapfile none swap sw 0 0
\end{lstlisting}

На всякий случай отмечу, что каждый раз создавать swap-файл не нужно: просто подключаете и отключаете его с помощью swapon/swapoff. Работа со swap-разделами в Linux происходит аналогичным образом.

\subsection{Приоритет SWAP-файлов}
Создавать и использовать swap-файлов в Linux можно любое количество. При этом можно указать приоритет подключаемого swap-файла или раздела (хотя ядро умеет самостоятельно распределять по разделам/файлам подкачки).

Например, высший приоритет для файла подкачки задаётся так:

\begin{lstlisting}
# swapon -p 1 /opt/swapfile
\end{lstlisting}

Приоритет является целым числом от 0 до 32767.

\subsubsection{Очистка swap-пространства после ресурсоёмких приложений}
Командой swapoff -a, запущенной от имени root, можно отключить использование всех разделов и файлов подкачки. После ввода команды содержимое свопа за несколько минут загружается обратно в оперативную память, а сам раздел подкачки отключается.
После загрузки содержимого свопа в оперативную память включем своп обратно командой swapon -a.

\subsubsection{Системные настройки использования своппинга - Linux}
За интенсивность обращения системы к swap-файлам и swap-разделам отвечает параметр swappiness, равный по умолчанию 60. Значение параметра может быть в пределах от 0 - наименьшее использование подкачки, до 100 - подкачка используется часто.

Насчёт оптимального значения параметра swappiness есть много разных мнений. Так, например, один из ведущих разработчиков ядра Эндрю Мортон считает, что для десктопа лучше ставить большое значение, чтобы всякое блоатваре скинуть в своп и использовать оперативную память для чего-то нужного.

Временно (до перезагрузки системы) изменить этот параметр можно с помощью команды:

\begin{lstlisting}
# echo 50 > /proc/sys/vm/swappiness
\end{lstlisting}

Чтобы изменить значение по умолчанию, необходимо изменить параметр vm.swappiness:

\begin{lstlisting}
vm.swappiness=50
\end{lstlisting}

в файле /etc/sysctl.conf

Следует, впрочем, отметить, что со vm.swappiness сильно перегибать палку не стоит. При больших значениях система потеряет в отзывчивости (будет вытеснять память, с которой работают приложения, в своп, хотя оперативной памяти ещё много). При малых значениях система работает отзывчивей, но когда оперативная память заканчивается, система начинает активно свопиться и притормаживать.
Также можно попробовать увеличить/уменьшить объём потребляемой системой памяти за счёт изменения размеров дискового кеша. Уровень выделяемой под кеш памяти хранится в
\begin{lstlisting}
/proc/sys/vm/vfs_cache_pressure
\end{lstlisting}
Значение по умолчанию: 100. Чтобы использовать меньше памяти под дисковые кеши (что вообще говоря не есть хорошая идея), ставим значение 50. Если, наоборот, хочется больше отзывчивости системы, увеличиваем размер кеша не скупясь:

 \begin{lstlisting}
# echo 1000 > /proc/sys/vm/vfs_cache_pressure
\end{lstlisting}

и далее продолжаем играться с параметрами вплоть до полного удовлетворения. Для того, чтобы настройки стали постоянными, заносим параметр

\begin{lstlisting}
vm.vfs_cache_pressure = 1000
\end{lstlisting}

в файл /etc/sysctl.conf




\section{Как создать ramdisk в Linux?}
Бывают задачи, когда нужно работать с большим количеством мелких файлов и делать это по возможности быстро, без завязок на меееедленную файловую подсистему. 

Собственно, в ядре должна быть поддержка tmpfs, и если вы (или авторы вашего дистрибутива) не любители усложнять себе жизнь, она там должна быть.
Быстренько создаём новую точку монтирования:

\begin{lstlisting}
# mkdir /mnt/tmpfs/
# chmod 777 /mnt/tmpfs/
\end{lstlisting}


и даём все права на использование. После этого даём команду (от рута или через sudo):

\begin{lstlisting}
# mount -t tmpfs -o size=xxxM tmpfs /mnt/tmpfs/
или
$ sudo mount -t tmpfs -o size=xxxM tmpfs /mnt/tmpfs/
\end{lstlisting}


где xxxM есть размер RAMdisk в Мегабайтах.
Будьте осторожны и не размахивайтесь слишком широко: если вы попросите создать ramdisk больше, чем имеете оперативной памяти, система начнёт сгружать всё в swap-файл и дела пойдут очень медленно и грустно.

Если же вы хотите изменить размер ramdisk - это просто:

\begin{lstlisting}
# mount -o remount -o size=yyyM /mnt/tmpfs/
или
$ sudo mount -o remount -o size=yyyM /mnt/tmpfs/
\end{lstlisting}


При этом содержимое диска не пропадёт, но его размер тут же увеличится (при уменьшении также ничего не пропадёт, если только данных не больше, чем диск).


\section{Два слова о /proc}
Используя файловую систему /proc, можно изменять многие параметры системы без необходимости перезагрузки машины и многое узнать о работе системы. О некоторых полезных командах - далее в этом посте.

Файловая система /proc - это виртуальная файловая система[1], поэтому файлы, которые вы найдете в этом каталоге, на самом деле не занимают места на вашем жестком диске. Это карта, создаваемая ядром и присоединяемая к вашей обычной файловой системе, чтобы обеспечить доступ к настройкам ядра и информации о системе.

\subsection{Общие слова}
Не стоит открывать эти файлы обычным текстовым редактором - это может нарушить целостность данных или ядро может успеть изменить значения в этих файлах. Чтобы этого избежать, следует пользоваться командами echo и cat для установки и просмотра содержимого файлов соответственно.

Чтобы передать значение fake в файл /proc/your/file, следует дать команду:

\begin{lstlisting}
# echo "fake" > /proc/your/file
\end{lstlisting}

Для того, чтобы увидеть значение в файле, используем cat:

\begin{lstlisting}
# cat /proc/your/file
\end{lstlisting}

    получим:

    fake

В основном в /proc вы найдете файлы read-only за исключением /proc/sys, которая содержит большинство параметров ядра и предназначена для изменения во время работы системы.


\subsection{Примеры использования /proc}
В каталоге /proc множество файлов, большинство из них - только для чтения, из них можно узнать многое об оборудовании. Но есть файлы и на запись - они позволяют менять на лету параметры работы ядра. Вот некоторые из них:

\subsubsection{/proc/scsi/scsi}
Позволяет добавить или отключить диск, если он поддерживает горячую замену (SCSI или SATA). Указать ядру на подключение нового диска можно командой:

\begin{lstlisting}
# echo "scsi add-single-device w x y z" > /proc/scsi/scsi
\end{lstlisting}


Чтобы эта команда работала правильно, вы должны указать параметры значений w, x, y, и z следующим образом:

\begin{itemize}
 \item w — это ID хост адаптера, где первый адаптер имеет ID ноль (0))
 \item x — это канал SCSI на хост адаптере, где первый канал ноль (0)
 \item y — это SCSI ID устройства
 \item z — это номер LUN, где первый LUN ноль (0)
\end{itemize}

Этот трюк можно проворачивать не только с дисками: в своё время это пришлось делать мне для подключения многослотового кардиридера.

Чтобы извлечь диск из системы без перезагрузки, размонтируем его и даём команду:

\begin{lstlisting}
# echo "scsi remove-device w x y z" > /proc/scsi/scsi
\end{lstlisting}

Перед тем как ввести эту команду и удалить SCSI диск, убедитесь, что вы отмонтировали файловые системы на этом диске.


\subsubsection{/proc/sys/kernel/acct}
Здесь содержатся три конфигурируемых значения, которые управляют подсчётом процессов, основанном на свободном пространстве файловой системы:
\begin{enumerate}
\item Если свободное пространство ниже значения в процентах, то процесс подсчета останавливается.
\item Если свободное пространство выше, то процесс запускается.
\item Частота в секундах, с которой проверяются предыдущие два значения.
\end{enumerate}

Чтобы изменить значения в этом файле, вам следует использовать разделенный список параметров. Значения по умолчанию: 2 4 30

Для их изменения следует дать команду

\begin{lstlisting}
# echo "3 5 40" > /proc/sys/kernel/acct
\end{lstlisting}

Эти значения остановят подсчёт, если в файловой системе менее 3 процентов свободного пространства и начнет опять если появится 5 или более процентов. Проверка производится каждые 40 секунд.


\subsubsection{/proc/sys/kernel/ctrl-alt-del}
Этот файл содержит двоичное значение, которое управляет реакцией системы на комбинацию ctrl+alt+delete. Возможны два значения:

\begin{enumerate}
\item Ноль (0) значит, что ctrl+alt+delete принимается и отправляется программе init, что обеспечит правильный останов и перезагрузку как если бы вы ввели команду reboot.
\item Один (1) значит, что ctrl+alt+delete не принимается и никакого чистого отключения не происходит - перезагрузка как при нажатии на RESET.
\end{enumerate}

Значение по умолчанию — 0.


\subsubsection{/proc/sys/kernel/panic}
Задаёт время в секундах, которое ядро будет ждать перед перезагрузкой если произойдет "kernel panic". Установка в ноль (0) секунд отключит возможность перезагрузки при kernel panic.
Значение по умолчанию - 0.

\subsubsection{/proc/sys/kernel/sysrq}
Включает или выключает возможность использования Волшебной SysRQ-клавишей (Magick System Request Key). Если в ядре она активирована, чаще всего значение в этом файле 1.
Об этой клавише и её возможностях было написано тут.


\subsubsection{/proc/sys/vm/swappiness}
Этот параметр позволяет регулировать стремление системы сбрасывать данные из памяти в файл подкачки. Чрезмерное значение здесь приведёт к интенсивному использованию своп-файла, что нежелательно в ряде случаев (ноутбуки, lowlatency-системы). Слишком маленькое значение может привести к тому, что при заполнении памяти будет принудительно запущен OOMkiller (процесс, запускающийся при исчерпании памяти и убивающий наиболее ресурсоёмкие задачи).

Значение параметра может быть в пределах от 0 (наименьшее использование подкачки) до 100 (подкачка 
используется часто). Значение по умолчанию - 60. Есть сообщения, что при большом объёме памяти (от 1Гб) 
оптимальным значением является 10. Для этого:

\begin{lstlisting}
# echo "10" > /proc/sys/vm/swappiness
\end{lstlisting}

\subsection{Как сделать настройки в /proc постоянными}
Для того, чтобы изменения в директории /proc/sys стали постоянными, нужно внести изменения в файл конфигурации для sysctl - /etc/sysctl.conf

Формат этого файла требует некоторых пояснений. Так как sysctl может только изменять переменные в директории /proc/sys, то часть имени переменной обозначающая директорию отбрасывается. Другое изменение касается слэшей, которые заменяются на точки. Вот два простых правила для преобразования файлов в /proc/sys и переменных в sysctl:

\begin{enumerate}
\item Уберите из начала команды /proc/sys;
\item Замените слэши на точки в имени файла.
\end{enumerate}

Эти два правила позволят вам преобразовать любой файл в /proc/sys в любое имя переменной в sysctl. Обычное преобразование имени файла в переменную:

\begin{lstlisting}
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file
\end{lstlisting}

Вы можете увидеть все переменные, доступные для изменения, используя команду sysctl -a.

Хотя нижеследующее замечание относится к другой файловой системе, /sys, я считаю полезным привести здесь один пример. Это смена планировщиков ввода-вывода на лету. Чтобы узнать, какой планировщик стоит сейчас, даём команду:

\begin{lstlisting}
$ cat /sys/block/sdX/queue/scheduler
\end{lstlisting}


Заменяя sdX на интересующее нас устройство. Текущий планировщик отмечен в квадратных скобках:

\begin{lstlisting}
noop anticipatory deadline [cfq]
\end{lstlisting}

То есть сейчас стоит cfq - complete fair queue, полностью честный планировщик. Планировщики для разных дисков могут быть разными. Значения, которые можно передать в этот файл, такие: "as", "cfq", "deadline" или "noop". Об этом в других постах.


\section{cfdisk и mkfs: разметка и форматирование разделов в Linux}
После приобретения нового винчестера или флешки нужно разбить свежее пространство на разделы и отформатировать их под требуемую файловую систему Linux. Это очень просто только почему-то об этом не пишут.

\subsection{Создание раздела на жёстком диске в Linux}
Для этого используем. Для создания разделов потребуются привилегии root, добываемые командной su.

После этого пишем:

\begin{lstlisting}
# cfdisk /dev/hdb
\end{lstlisting}

Нажимаем на New, создать раздел. Выбираем Primary (основной)
Создастся, нажимаем Bootable (если нужно, чтобы он был загружаемый). Если уверены, что всё сделано правильно - записываем изменения, нажимаем Write и пишем yes

Всё, разделы созданы, выходим из программы, выбирая Quit.

\subsubsection{Если на диске "битый" раздел}
К примеру, таблица разделов на флешке повреждена настолько, что проще всё снести и создать заново - тогда делаем так: 

\begin{lstlisting}
# cfdisk -z /dev/hdb
\end{lstlisting}


Параметр -z создаёт нулевую таблицу разделов, и позволяет сразу начать формировать новую.


\subsection{Форматирование дисков в Linux}
Для этого сначала нужно выбрать файловую систему. 

Далее, по умолчанию в Debian поставлены утилиты ext3. Если нужных нет - ставим:

\begin{lstlisting}
# aptitude install reiserfsprogs xfsprogs jfsutils
\end{lstlisting}

После этого пишем:

\begin{lstlisting}
$ sudo mkfs -t %типФС% %/файл/устройства%
\end{lstlisting}


Вместо /файл/устройства пишем имя форматируемого раздела, например /dev/hdb1. В нашем примере это выглядит так:

\begin{lstlisting}
$ sudo mkfs -t ext3 /dev/hdb1
\end{lstlisting}


После форматирования раздел сразу же можно смонтировать и использовать. 

\subsection{Настройка файловой системы}
\textbf{ВНИМАНИЕ! Всё нижеописанное делается на ОТМОНТИРОВАННОЙ файловой системе!} Здесь нужно ещё отметить тот факт, что при форматировании в ext3, для пользователя root резервируется 5\% места. Чтобы убрать 5 процентное резервирование места для root в ext3 нужно дать команду:

\begin{lstlisting}
# tune2fs -m 0 /dev/hdb1
\end{lstlisting}


После этого простому пользователю будет доступно всё место.

Так же имеет место быть принудительная проверка диска после некоторого количества загрузок. Если вам это не нужно, процедуру можно отменить командой:

\begin{lstlisting}
# tune2fs -c 0 /dev/sda1
\end{lstlisting}


Либо сделать так, чтобы проверка происходила реже, например, 1 раз в 100 загрузок:

\begin{lstlisting}
# tune2fs -c 100 /dev/sda1
\end{lstlisting}

Просмотреть свойства файловой системы можно командой

\begin{lstlisting}
# tune2fs -l /dev/sda1
\end{lstlisting}
и узнать о ней много интересного. 

\subsection{Информация о разделах винчестера}
Иногда требуется узнать, какие разделы на винчестере есть и какая там файловая система. Для того, чтобы узнать информацию о разделах жесткого диска, набираем от root пользователя:

\begin{lstlisting}
$ fdisk -l /dev/sda
\end{lstlisting}


в ответ получаем:

\begin{lstlisting}
Disk /dev/sda: 160.0 GB, 160041885696 bytes
255 heads, 63 sectors/track, 19457 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0xd0f4738c

Device Boot Start End Blocks Id System
/dev/sda1 1 61 489951 82 Linux swap / Solaris
/dev/sda2 * 15567 19457 31254457+ 83 Linux
/dev/sda3 62 15566 124543912+ 83 Linux
\end{lstlisting}


Откуда видим: есть три раздела, первый из них (/dev/sda1) это раздел подкачки (500 мегабайт). Второй раздел (/dev/sda2) на 30Гб, трейтий (/dev/sda3) на 120Гб. Активный раздел (который сейчас используется операционной системой) помечен звёздочкой.

Узнать, на каком разделе вы сейчас работаете, можно с помощью команды:

\begin{lstlisting}
df .
\end{lstlisting}

точка на конце обязательна


\section{Дата и время: date в Linux}
Время от времени приходится поправлять часы или узнавать в консоли точное время - для этого, как известно, есть команда date. Но у неё есть множество других замечательных возможностей, о которых владельцы UNIX-систем могут и не догадываться. Итак...

Просто просмотреть время можно командой:

\begin{lstlisting}
$ date

%Чтв Авг% 21 14:07:23 MSD 2008
\end{lstlisting}



Чтобы изменить время часов, нужно заделаться рутом и написать:

\begin{lstlisting}
# date MMDDhhmm
\end{lstlisting}


То есть в виде МесяцДеньЧасМинута, остальное \\ \verb+[MMDDhhmm[[CC]YY][.ss]]+ по вкусу. Об это хорошо (и главное в самом верху) написано в мануале man date, однако остальное писалось, по всей видимости, роботами для роботов.

Среди функций date есть также вычисление дат. Например, вы хотите узнать, какое число было вчера:

\begin{lstlisting}
$ date --date="yesterday" +%F
\end{lstlisting}
или
\begin{lstlisting}
$ date --date="1 days ago" +%F

2008-08-13
\end{lstlisting}


Или, скажем, какое число будет в воскресенье через две недели:

\begin{lstlisting}
$ date --date="sunday next 2 week"

Sun Aug 31 01:00:00 EEST 2008
\end{lstlisting}


Если специально не оговаривать срок, то названия дней недели командой date будут восприниматься как ближайшие. Например, узнать дату ближайшей пятницы:

\begin{lstlisting}
$ date --date="friday" +%F

2008-08-15
\end{lstlisting}


Тот же результат вы получите, если добавите ко дню недели слово this то есть date --date="this friday" +\%F

Прошедшие дни недели указываются при помощи ключевого слова last например, какое число было в прошлую пятницу:

\begin{lstlisting}
$ date --date="last friday" +%F

2008-08-08
\end{lstlisting}


Думаю, что это хороший повод ещё разок за рюмкой чая почитать man date здесь (на русском).

А ещё можно смотреть не просто на даты, а на календарик в консоли - для этого есть замечательная команда cal - без параметров она выдаст календарь на текущий месяц:

\begin{framed}
\begin{lstlisting}%Июль% 2009
%Пн% %Вт% %Ср% %Чт% %Пт% %Сб% %Вс%
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
\end{lstlisting}
\end{framed}



Просто и со вкусом. Если же вам нужен календарь на год:

\begin{lstlisting}
$ cal 2009
\end{lstlisting}

даст искомое. Календарь на месяц можно приготовить так: cal 02 2009 выдаст календарь на февраль 2009 года.

Помимо cal существует также ncal - Если же нужен ``вертикальный'' календарик, вроде

\begin{framed}
\begin{verbatim}Февраль 2010
Пн 1 8 15 22
Вт 2 9 16 23
Ср 3 10 17 24
Чт 4 11 18 25
Пт 5 12 19 26
Сб 6 13 20 27
Вс 7 14 21 28 \end{verbatim}
\end{framed}

это можно сделать с помощью команды ncal. Кстати, этот вывод очень хорошо вставляется в Inkscape и далее можно быстро набросать простой календарик для ежедневника.


